﻿#include<iostream>
using namespace std;

const int N = 100010;
int head, ne[N], e[N], idx;

//初始化
void init()
{
    head = -1;
    idx = 0;
}
//插入到头节点前面
//向链表头插入一个数；
void add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}
//删除第 k个插入的数后面的数
//删除下标为k的数
void remove(int k)
{
    ne[k] = ne[ne[k]];
}
//在下标为k的数后面插入一个数
//在第 k个插入的数后插入一个数
void add(int k, int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}

int main()
{

    int m, x, k;
    cin >> m;

    init();//这个不要忘了

    //int op; 不是int 写的时候长点心

    while (m--)
    {

        char op;
        cin >> op;
        /*getchar();
        scanf("%c", &op);*/
        //前面要写个空格吸收回车，否则无法读入
        if (op == 'H')
        {
            cin >> x;
            add_to_head(x);
        }
        else if (op == 'D')
        {
            cin >> k;
            if (!k)//删除头节点k==0
            {
                head = ne[head];
            }
            remove(k - 1);
        }
        else
        {
            cin >> k >> x;
            add(k - 1, x);
        }
        // cout<<op<<endl;
    }
    for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
    cout << endl;
}

//总结
/*
1.头节点前插入要注意
2.init();//这个不要忘了
3.int op; 不是int，是char写的时候长点心
4.cin与scanf  cin>>op;   getchar();scanf("%c", &op); 前面要写个空格吸收回车，否则无法读入
5.删除的时候，k-1要越界判断，当k=0时，头指针指向头结点的下一个节点  if (!k) head = ne[head]; */